import pandas

# pandas库的基础学习

# Series的创建
data_1 = pandas.Series(data=['项少龙', '琴清', '乌廷芳', '善柔'], index=['主角', '一老婆', '二老婆', '三老婆'])
print(data_1)
print('\n')
dict_1 = {'主角': '项少龙', '一老婆': '琴清', '二老婆': '乌廷芳', '三老婆': '善柔'}
data_1 = pandas.Series(dict_1)
print(data_1)
print('\n')
# 以上两种创建Series的方法都可以，但建议使用第二种，因为第二种更加直观。直接使用字典作为参数，可以更加方便地创建Series
# DataFrame的创建
dict_2 = {'男': {'项少龙': '主角'}, '女': {'琴清': '一号老婆', '乌廷芳': '二号老婆', '善柔': '三号老婆'}}
data_2 = pandas.DataFrame(dict_2)
print(data_2)
print('\n')
dict_2 = {
    '身份': {'项少龙': '主角', '琴清': '一号老婆', '乌廷芳': '二号老婆', '善柔': '三号老婆'},
    '性别': {'项少龙': '男', '琴清': '女', '乌廷芳': '女', '善柔': '女'}}
data_2 = pandas.DataFrame(dict_2)
print(data_2)
# 从csv文件中读入数据(Dataframe)
# header：指定哪一行作为列名，names：如果没有列名或希望自定义列名，可以提供一个列表来指定列名。
data_3 = pandas.read_csv('pandas_1.csv', sep='\t', header=0, )  # 读取csv文件，sep='\t'表示分隔符为\t，header=0表示第一行是列名  sep：指定分隔符
print(data_3)
data_3 = pandas.DataFrame(data_3)
# DataFrame的插入、删除、修改
# 使用loc方法插入数据(基于索引或者标签)
data_2.loc['赵倩'] = {'身份': '未婚妻', '性别': '女'}  # 使用loc方法插入一行(向末尾插入一行)
print(data_2)
data_2.loc[:, '描述'] = ['穿越者', '才女佳人', '乌家大小姐', '侠骨柔情之刺客', '赵国公主']  # 使用loc方法插入一列(向末尾插入一列)
print(data_2)
dict_3 = {'姓名': '赵善柔', '年龄': 25, '性别': '女', '身高': 170}
print(data_3)
# data_3.loc[0] = dict_3  # 使用loc方法插入一行(向指定位置插入一行)
# 上面暂且不对data_3进行操作，因为data_3格式不正确，无法插入数据 只显示Nan
# 使用insert方法插入数据(基于位置)
list_1 = ['古天乐', '郭羡妮', '宜萱', '滕丽名', '郑雪儿'];
data_2.insert(3, '演员', list_1);
print(data_2)
# 使用DataFrame进行索引和切片
# 列索引的值就是列columns中的内容
# for example
# 选择列
print(data_2.身份);
print(data_2['性别'])  # 两者的效果一致
# 选择行
print(data_2[:0])  # 两者的效果一致
# 也可使用loc与iloc的方法
# 这里注意loc如果索引已经改为其他标签的则不支持使用数字

# # # # # #   使用loc(基于标签名称)
# 选择行
print(data_3.loc[2])  # 选择数据索引为2(第3)的行
print(data_2.loc['赵倩'])  # 选择标签为'赵倩'的行
print(data_1.loc['主角'])  # 选择'主角'行

# 选择列
print(data_2.loc[:, '演员'])  # 选择了'演员这一列'

# # # # # #   使用iloc(基于索引)
# 选择行
print(data_2.iloc[1])  #选择了数据索引为1(第2)的行
print(data_3.iloc[2])
# # #  # # # # 切片
print(data_2.loc['项少龙':'善柔'])  #使用标签名称  切出标签项少龙到善若之间(包括自身)的所有标签的值
print(data_3.loc[2:4])  # 使用索引  切出索引2到4(包括自身)的所有行的值
print(data_2.loc[:, '描述'])  # 使用loc切出'描述'列
print(data_2.iloc[1:3, 1:3])  #   使用iloc  切出索引1到3(包括自身)和列1到3(包括自身)的所有值
dict_4 = {'姓名': ['繁繁', '楠楠', '威威', '然然'],
          '学号': {'繁繁': 202301, '楠楠': 202302, '威威': 202303, '然然': 202304},
          '身高': {'繁繁': 185, '楠楠': 170, '威威': 175, '然然': 175},
          '宿舍号': {'繁繁': 1, '楠楠': 2, '威威': 3, '然然': 4}
          }
# 将字典转换为列表，每个元素是一个包含所有属性的元组
data_list = [(name, dict_4['学号'][name], dict_4['身高'][name], dict_4['宿舍号'][name]) for name in dict_4['姓名']]
print(data_list)
# 创建DataFrame
data_4 = pandas.DataFrame(data_list, columns=['姓名', '学号', '身高', '宿舍号'])
print(data_4)
dict_5 = {
    '学号': {'繁繁': 202301, '楠楠': 202302, '威威': 202303, '然然': 202304},
    '身高': {'繁繁': 185, '楠楠': 170, '威威': 175, '然然': 175},
    '宿舍号': {'繁繁': 1, '楠楠': 2, '威威': 3, '然然': 4}
}
data_5 = pandas.DataFrame(dict_5)
print(data_5)
# 使用rename进行名字的更改
print(data_5.rename(columns={'学号': '编号'}))  # columns(更改列名)
print(data_5.rename(index={'繁繁': 'fanfan'}))  # index(更改行名)
